home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Misc / Wood.0.72 / Sources / RTFDescription.m < prev    next >
Encoding:
Text File  |  1994-06-22  |  4.1 KB  |  235 lines

  1.  
  2. #import "RTFDescription.h"
  3.  
  4. static const char *header = "{\\rtf0\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\fo\n";
  5.  
  6. @implementation RTFDescription
  7.  
  8. - init
  9. {
  10.     [super init];
  11.     textStream = NULL;
  12.     buffer = NULL;
  13.     return self;
  14. }
  15.     
  16. - free
  17. {
  18.     if(textStream)
  19.         NXCloseMemory(textStream,NX_FREEBUFFER);
  20.     NX_FREE(buffer);
  21.     return [super free];
  22. }
  23.  
  24. - copyFromZone:(NXZone *)zone
  25. {
  26.     RTFDescription *theCopy;
  27.     
  28.     theCopy = [super copyFromZone:zone];
  29.     theCopy->textStream = NULL;
  30.     if(buffer){
  31.         NX_ZONEMALLOC(zone, theCopy->buffer,char,strlen(buffer) + 1);
  32.         strcpy(theCopy->buffer, buffer);
  33.     } else
  34.         theCopy->buffer = NULL;
  35.     return theCopy;
  36. }
  37.     
  38. - (NXStream *)stream
  39. {
  40.     if(!textStream){
  41.         textStream = NXOpenMemory(0,0,NX_READWRITE);
  42.         if(!buffer)
  43.             NXWrite(textStream, header, strlen(header));
  44.         else
  45.             NXWrite(textStream, buffer, strlen(buffer));
  46.     }
  47.     NXSeek(textStream, 0L, NX_FROMSTART);
  48.     return textStream;
  49. }
  50.  
  51. - freeStream
  52. {
  53.     if(textStream)
  54.         NXCloseMemory(textStream,NX_FREEBUFFER);
  55.     textStream = NULL;
  56.     return self;
  57. }
  58.  
  59. - setRTFFromTextView:aView
  60. {
  61.     int maxlen,length;
  62.     char *ptr;
  63.     
  64.     if(textStream)
  65.         NXCloseMemory(textStream,NX_FREEBUFFER);
  66.     textStream = NXOpenMemory(0,0,NX_READWRITE);
  67.     [aView writeRichText:textStream];
  68.     NXGetMemoryBuffer(textStream, &ptr, &length, &maxlen);
  69.     if(buffer){
  70.         NX_ZONEREALLOC([self zone], buffer,char,length + 1);    
  71.     } else {
  72.         NX_ZONEMALLOC([self zone], buffer,char,length + 1);
  73.     }
  74.     strcpy(buffer,ptr);
  75.     NXCloseMemory(textStream,NX_FREEBUFFER);
  76.     textStream = NULL;
  77.     return self;
  78. }
  79.     
  80. - setRTF:(const char *)string
  81. {
  82.     if(buffer){
  83.         NX_ZONEREALLOC([self zone], buffer,char,strlen(string) + 1);    
  84.     } else {
  85.         NX_ZONEMALLOC([self zone], buffer,char,strlen(string) + 1);
  86.     }
  87.     strcpy(buffer, string);
  88.     return self;
  89. }
  90.     
  91. - setAscii:(const char *)string
  92. {
  93.     int maxlen,length;
  94.     char *ptr;
  95.     
  96.     if(!string){
  97.         NX_FREE(buffer);
  98.         buffer = NULL;
  99.         return self;
  100.     }
  101.     if(textStream)
  102.         NXCloseMemory(textStream,NX_FREEBUFFER);
  103.     textStream = NXOpenMemory(0,0,NX_READWRITE);
  104.     NXWrite(textStream, header, strlen(header));
  105.     NXSeek(textStream, 0L, NX_FROMEND);
  106.     while(*string){
  107.         switch(*string){
  108.             case '\n':
  109.             case '{':
  110.             case '}':
  111.             case '\\':
  112.                 NXPutc(textStream, '\\');
  113.             break;
  114.             default:
  115.             break;
  116.         }
  117.         NXPutc(textStream, *string);
  118.         string++;
  119.     }
  120.     NXGetMemoryBuffer(textStream, &ptr, &length, &maxlen);
  121.     if(buffer){
  122.         NX_ZONEREALLOC([self zone], buffer,char,length + 1);    
  123.     } else {
  124.         NX_ZONEMALLOC([self zone], buffer,char,length + 1);
  125.     }
  126.     strcpy(buffer,ptr);
  127.     NXCloseMemory(textStream,NX_FREEBUFFER);
  128.     textStream = NULL;
  129.     return self;
  130. }
  131.     
  132. - beginAppend
  133. {
  134.     if(textStream)
  135.         NXCloseMemory(textStream,NX_FREEBUFFER);
  136.     textStream = NXOpenMemory(0,0,NX_READWRITE);
  137.     NXWrite(textStream, header, strlen(header));
  138.     return self;
  139. }
  140.  
  141. - appendRTF:(const char *)string
  142. {
  143.     if(!string)
  144.         return self;
  145.     NXSeek(textStream, 0L, NX_FROMEND);
  146.     NXWrite(textStream, string, strlen(string));
  147.     return self;
  148. }
  149.  
  150. - appendAscii:(const char *)string
  151. {
  152.     if(!string)
  153.         return self;
  154.     NXSeek(textStream, 0L, NX_FROMEND);
  155.     while(*string){
  156.         switch(*string){
  157.             case '\n':
  158.             case '{':
  159.             case '}':
  160.             case '\\':
  161.                 NXPutc(textStream, '\\');
  162.             break;
  163.             default:
  164.             break;
  165.         }
  166.         NXPutc(textStream, *string);
  167.         string++;
  168.     }
  169.     return self;
  170. }
  171.  
  172. - bold:(BOOL)flag
  173. {
  174.     [self appendRTF: flag ? "\\b " : "\\b0 "];
  175.     return self;
  176. }
  177.  
  178. - setJustify:(int)mode
  179. {
  180.     switch(mode){
  181.         case NX_LEFTALIGNED:
  182.         case NX_JUSTIFIED:
  183.             [self appendRTF:"\\ql "];
  184.             break;
  185.         case NX_CENTERED:
  186.             [self appendRTF:"\\qc "];
  187.             break;
  188.         case NX_RIGHTALIGNED:
  189.             [self appendRTF:"\\qr "];
  190.             break;
  191.         default:
  192.             break;
  193.     }
  194.     return self;
  195. }
  196.  
  197. - endAppend
  198. {
  199.     int maxlen,length;
  200.     char *ptr;
  201.     
  202.     NXGetMemoryBuffer(textStream, &ptr, &length, &maxlen);
  203.     if(buffer){
  204.         NX_ZONEREALLOC([self zone], buffer,char,length + 1);    
  205.     } else {
  206.         NX_ZONEMALLOC([self zone], buffer,char,length + 1);
  207.     }
  208.     strcpy(buffer,ptr);
  209.     NXCloseMemory(textStream,NX_FREEBUFFER);
  210.     textStream = NULL;
  211.     return self;
  212. }
  213.  
  214. - write:(NXTypedStream *)stream
  215. {
  216.     NXWriteType(stream,"*",&buffer);
  217.     return self;
  218. }
  219.  
  220. - read:(NXTypedStream *)stream
  221. {
  222.     NXReadType(stream,"*",&buffer);
  223.     return self;
  224. }
  225.  
  226. - awake
  227. {
  228.     [super awake];
  229.     textStream = NULL;
  230.     return self;
  231. }
  232.  
  233. @end
  234.  
  235.